package br.ufpe.cin.if680.lightmirror.core;
import java.awt.Graphics;


public class Parametros {
	//Atributos do Objeto
	protected double ka; //Ka: coeficiente ambiental [0-1]
	protected Vetor kd; //Kd: constante difusa (RGB) [0-1]
	protected double ks; //Ks: constante especular [0-1]
	protected Vetor od; //Od: cor do objeto (RGB) [0-1]
	protected double eta; //constante de rugosidade [0-infinito]

	//Atributos da Cena
	protected Vetor ia; //Ia: cor ambiental (RGB) [0-255]
	protected Vetor[] il; //Il: cor da luz (RGB) [0-255]
	protected Ponto[] pl; //PL: posição da fonte de luz (xyz) [0-1]
	protected int nPontosLuz = 1;

	//Atributos da Camera
	protected Ponto c; //C: ponto foco (xyz)
	protected Vetor n; //N: mira (xyz)
	protected Vetor v; //V: orientacao vertical 
	protected double d; //d: distancia do foco ao plano [0-infinito]
	protected double hx; //hx: meia largura do plano [0-infinito]
	protected double hy; //hy: meia altura do plano [0-infinito]

	protected double[][] zbuffer;

	protected Graphics grafico;
	protected Camera camera;
	protected double largura = 800;
	protected double altura = 600;
	protected Objeto objeto;

	//Modelo
	protected String arquivoModelo = "";
	protected Ponto[] pontos;
	protected Triangulo[] triangulos;


	public Parametros() {
	}

	public void criarCamera(){
		this.camera = new Camera(this);
	}

	public double getKa() {
		return ka;
	}

	public void setKa(double ka) {
		if(ka < 0 || ka > 1) {
			throw new IllegalArgumentException();
		}
		this.ka = ka;
	}

	public Vetor getKd() {
		return kd;
	}

	public void setKd(Vetor kd) {
		if(kd.getX() < 0 || kd.getX() > 1 || kd.getY() < 0 || kd.getY() > 1 || kd.getZ() < 0 || kd.getZ() > 1) {
			throw new IllegalArgumentException();
		}
		this.kd = kd;
	}

	public void setKd(double x, double y, double z) {		
		this.setKd(new Vetor(x, y, z));
	}

	public double getKs() {
		return ks;
	}

	public void setKs(double ks) {
		if(ks < 0 || ks > 1) {
			throw new IllegalArgumentException();
		}
		this.ks = ks;
	}

	public Vetor getOd() {
		return od;
	}

	public void setOd(Vetor od) {
		if(od.getX() < 0 || od.getX() > 1 || od.getY() < 0 || od.getY() > 1 || od.getZ() < 0 || od.getZ() > 1) {
			throw new IllegalArgumentException();
		}
		this.od = od;
	}

	public void setOd(double x, double y, double z) {
		this.setOd(new Vetor(x, y, z));
	}

	public double getEta() {
		return eta;
	}

	public void setEta(double eta) {
		if(eta < 0) {
			throw new IllegalArgumentException();
		}
		this.eta = eta;
	}

	public Vetor getIa() {
		return ia;
	}

	public void setIa(Vetor ia) {
		if(ia.getX() < 0 || ia.getX() > 255 || ia.getY() < 0 || ia.getY() > 255 || ia.getZ() < 0 || ia.getZ() > 255) {
			throw new IllegalArgumentException();
		}
		this.ia = ia;
	}

	public void setIa(double x, double y, double z) {
		this.setIa(new Vetor(x, y, z));
	}

	public Vetor[] getIl() {
		return il;
	}

	public void setIl(Vetor... il) {
		if(il.length != nPontosLuz) {
			throw new IllegalArgumentException();
		}
		for(Vetor i : il) {
			if(i.getX() < 0 || i.getX() > 255 || i.getY() < 0 || i.getY() > 255 || i.getZ() < 0 || i.getZ() > 255) {
				throw new IllegalArgumentException();
			}
		}

		this.il = il;
	}

	public void setIl(double x, double y, double z) {
		this.setIl(new Vetor(x, y, z));
	}

	public Ponto[] getPl() {
		return pl;
	}

	public void setPl(Ponto... pl) {
		if(pl.length != nPontosLuz) {
			throw new IllegalArgumentException();
		}
		this.pl = pl;
	}

	public void setPl(double x, double y, double z) {
		this.setPl(new Ponto(x, y, z));
	}

	public Ponto getC() {
		return c;
	}

	public void setC(Ponto c) {
		this.c = c;
	}

	public void setC(double x, double y, double z) {
		this.setC(new Ponto(x, y, z));
	}

	public Vetor getN() {
		return n;
	}

	public void setN(Vetor n) {
		this.n = n;
	}

	public void setN(double x, double y, double z) {
		this.setN(new Vetor(x, y, z));
	}

	public Vetor getV() {
		return v;
	}

	public void setV(Vetor v) {
		this.v = v;
	}

	public void setV(double x, double y, double z) {
		this.setV(new Vetor(x, y, z));
	}

	public double getD() {
		return d;
	}

	public void setD(double d) {
		if(d < 0) {
			throw new IllegalArgumentException();
		}
		this.d = d;
	}

	public double getHx() {
		return hx;
	}

	public void setHx(double hx) {
		if(hx < 0) {
			throw new IllegalArgumentException();
		}
		this.hx = hx;
	}

	public double getHy() {
		return hy;
	}

	public void setHy(double hy) {
		if(hy < 0) {
			throw new IllegalArgumentException();
		}
		this.hy = hy;
	}

	public double getLargura() {
		return largura;
	}

	public void setLargura(double largura) {
		if(largura <= 0) {
			throw new IllegalArgumentException();
		}
		this.largura = largura;
	}

	public double getAltura() {
		return altura;
	}

	public void setAltura(double altura) {
		if(altura <= 0) {
			throw new IllegalArgumentException();
		}
		this.altura = altura;
	}

	public double[][] getZbuffer() {
		if(getLargura() <= 0 || getAltura() <= 0) {
			throw new IllegalStateException();
		}

		if(zbuffer == null) {
			zbuffer = new double[(int) largura][(int) altura];
		}
		return zbuffer;
	}

	public void setZbuffer(int m, int n, double valor) {
		this.zbuffer[m][n] = valor;
	}

	public Graphics getGrafico() {
		return grafico;
	}

	public void setGrafico(Graphics grafico) {
		this.grafico = grafico;
	}

	public String getArquivoModelo() {
		return arquivoModelo;
	}

	public void setArquivoModelo(String arquivoModelo) {
		this.arquivoModelo = arquivoModelo;
	}

	public Ponto[] getPontos() {
		return pontos;
	}

	public void setPontos(Ponto[] pontos) {
		this.pontos = pontos;
	}

	public Triangulo[] getTriangulos() {
		return triangulos;
	}

	public void setTriangulos(Triangulo[] triangulos) {
		this.triangulos = triangulos;
	}
	
	public void setNPontosLuz(int pontosLuz) {
		nPontosLuz = pontosLuz;
	}
	
	public int getNPontosLuz() {
		return nPontosLuz;
	}
	
	public void setObjeto(Objeto objeto) {
		this.objeto = objeto;
	}
	
	public Objeto getObjeto() {
		return objeto;
	}
}
